#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
//   pid_t id=fork();
//   if(id<0)
//   {
//       perror("子进程创建失败");
//   }
//   else if(id==0)
//   {
//      printf("i am child,pid=%d,ppid=%d\n",getpid(),getppid());
//      exit(0);
//   }
//   else
//   {
//      sleep(5);
//      wait(NULL);
//      printf("i am parent,pid=%d,ppid=%d\n",getpid(),getppid());
//      sleep(5);
//   }
//   for(int i=0;i<10;i++)
//   {
//   // sleep(1);
//      pid_t id=fork();
//      if(id==0)
//      {
//        printf("i am child,pid=%d,ppid=%d\n",getpid(),getppid());
//        exit(i);
//      }
//   }
//   for(int i=0;i<10;i++)
//   {
//      int status=0;
//      pid_t id=waitpid(-1,&status,0);
//      if(id>0)
//      {
//          printf("wait %d success,exit code:%d\n",id,(status>>8)&(0b11111111));
//         // printf("wait %d success,exit code:%d\n",id,WEXITSTATUS(status));
//         // printf("wait %d success,exit code:%d\n",id,WEXITSTATUS(status));
//      }
//      // pid_t id=wait(NULL);
//      // printf("回收%d\n",id);
//   }
//  // sleep(15);
//  // int d=wait(1);
//  // if(d<0)
//  // printf("回收失败\n");
//  // else 
//  //printf("回收成功\n");
//   
//   sleep(10);
   pid_t id=fork();//创建子进程
   if(id<0){
       perror("fork");
       return 1;
   }
   else if(id==0)//子进程
   {
       int cnt=5;
       while(cnt)
       {
           printf("i am child,pid:%d,ppid:%d\n",getpid(),getppid());
           cnt--;
           sleep(3);
       }
       exit(11);
      // WEXITSTATUS(status);
   }
   else{//父进程
      printf("father:%d\n",id);//这里给的子进程的pid
     int cnt=5;
     while(cnt)
     {
         printf("i am father,pid:%d,ppid:%d\n",getpid(),getppid());
         cnt--;
         usleep(1);
     }
     int status=0;
     while(1){//轮询式等待进程的退出
        pid_t ret=waitpid(id,&status,WNOHANG);//WNOHANG非阻塞模式 WUNTRACED阻塞状态，即暂停状态
        if(ret>0){//大于0等到了进程的退出
            if(WIFEXITED(status))//检查进程是不是正常退出，如果正常退出返回非零的数
            {
               printf("进程是正常跑完的，退出码：%d\n\n",WEXITSTATUS(status));
            }
            else//进程退出不正常，返回0
            { 
               printf("进程出现异常了\n");
            }
            break;
        }
        else if(ret<0)//等待进程意外失败
        {
           printf("wait failed");
           break;
        }
        else//还没有等到进程的退出
        {
            printf("你好了吗，还要我等上了？\n");
            sleep(1);
        }
     }
   }
   return 0; 
}

